/**
 * 文件名：@AbstractRenderer.java <br/>
 * 包名：cn.efunbox.afw.core.renderer <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.renderer;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 类名：AbstractRenderer  <br />
 *
 * 功能：渲染器基础实现
 *
 * @author xtwin <br />
 * 创建时间：2015年12月1日 下午3:57:14  <br />
 * @version 2015年12月1日
 */
public abstract class AbstractRenderer implements Renderer {
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(AbstractRenderer.class);
	
	// 默认编码方式，默认为UTF-8
	protected String encoding = "UTF-8";
	
	// 前缀
	protected String prefix = "";
	
	// 后缀
	protected String suffix = "";

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月1日 下午3:57:27<br/>
	 * 
	 * @param template
	 * @param datas
	 * @return <br/>
	 * @see cn.efunbox.afw.core.renderer.Renderer#render(java.lang.String, java.lang.Object)
	 */
	@Override
	public String render(String template, Object datas) {
		StringWriter sw = new StringWriter();
		
		render(sw, template, datas);
		
		return sw.toString();
	}

	/**
	 * 功能: 使用默认编码方式执行渲染 <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月1日 下午3:57:27<br/>
	 * 
	 * @param writer
	 * @param template
	 * @param datas <br/>
	 * @see cn.efunbox.afw.core.renderer.Renderer#render(java.io.Writer, java.lang.String, java.lang.Object)
	 */
	@Override
	public void render(Writer writer, String template, Object datas) {
		// 使用默认编码方式进行渲染
		render(writer, template, encoding, datas);
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月1日 下午3:57:27<br/>
	 * 
	 * @param writer
	 * @param template
	 * @param encoding
	 * @param datas <br/>
	 * @see cn.efunbox.afw.core.renderer.Renderer#render(java.io.Writer, java.lang.String, java.lang.String, java.lang.Object)
	 */
	@Override
	public void render(Writer writer, String template, String encoding, Object datas) {
		try {
			String _template = getTemplateName(template);
			
			if (logger.isDebugEnabled()) {
				logger.debug("parse template is : " + _template);
			}
			
			doRender(writer, _template, encoding, datas);
		} catch (Exception e) {
			logger.error("template render error.", e);
		} finally {
			try {
				writer.flush();
			} catch (IOException e) {
				logger.error("flush is error.", e);
			}
		}
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月1日 下午4:02:47 <br/>
	 */
	protected String getTemplateName(String template) {
		return new StringBuilder()
				.append(prefix) // 拼接上前缀
				.append(template) // 拼接上名称
				.append(suffix) // 拼接上后缀
				.toString();
	}
	
	/**
	 * 
	 * 功能：由子类实现具体的渲染逻辑 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月1日 下午4:04:19 <br/>
	 */
	protected abstract void doRender(Writer writer, String template, String encoding, Object datas) throws Exception;

	/**
	 * @version 2015年12月1日-下午4:07:41
	 */
	public String getEncoding() {
		return encoding;
	}

	/**
	 * @version 2015年12月1日-下午4:07:41
	 */
	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	/**
	 * @version 2015年12月1日-下午4:07:41
	 */
	public String getPrefix() {
		return prefix;
	}

	/**
	 * @version 2015年12月1日-下午4:07:41
	 */
	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	/**
	 * @version 2015年12月1日-下午4:07:41
	 */
	public String getSuffix() {
		return suffix;
	}

	/**
	 * @version 2015年12月1日-下午4:07:41
	 */
	public void setSuffix(String suffix) {
		this.suffix = suffix;
	}
}
